package sistema;
import org.junit.*;

import dados.Usuario;

import java.util.*;

public class VerificadorTest {

	@Test public void testaEmail(){
		Assert.assertTrue(Verificador.ehEmailValido("andre@aguinaldoabrantes.tk"));
		Assert.assertTrue(Verificador.ehEmailValido("deuzimars@gmail.com"));
		Assert.assertTrue(Verificador.ehEmailValido("aluno@ccc.ufcg.edu.br"));
		Assert.assertFalse(Verificador.ehEmailValido(""));
		Assert.assertFalse(Verificador.ehEmailValido("#lala@imbeingtrolled.fuuu"));
		Assert.assertFalse(Verificador.ehEmailValido("@omgFail"));
		Assert.assertFalse(Verificador.ehEmailValido("just.testing@fuck"));
		Assert.assertFalse(Verificador.ehEmailValido("A.@"));
		Assert.assertFalse(Verificador.ehEmailValido("PORFAVORNAOquebra"));
		Assert.assertFalse(Verificador.ehEmailValido("NAO QUEBRA PLS@ HOTMAIL.COM"));
		Assert.assertFalse(Verificador.ehEmailValido("tsc@.com"));
	}

	@Test public void testaTelefone(){
		Assert.assertTrue(Verificador.ehTelefoneValido("(83)1234-5678"));
		Assert.assertFalse(Verificador.ehTelefoneValido("234-5678"));
		Assert.assertFalse(Verificador.ehTelefoneValido("(1)1234-568"));
		Assert.assertFalse(Verificador.ehTelefoneValido("(  )1234-5678"));
		Assert.assertFalse(Verificador.ehTelefoneValido("|55|1234|5678"));
		Assert.assertFalse(Verificador.ehTelefoneValido("12345678"));
		Assert.assertFalse(Verificador.ehTelefoneValido("(34)12345678"));
		Assert.assertFalse(Verificador.ehTelefoneValido("32123-45678"));
		Assert.assertFalse(Verificador.ehTelefoneValido("1234-5678(83)"));
		Assert.assertFalse(Verificador.ehTelefoneValido("123405678"));
		Assert.assertFalse(Verificador.ehTelefoneValido("1234 5678"));
		Assert.assertFalse(Verificador.ehTelefoneValido("1234X5678"));
		Assert.assertFalse(Verificador.ehTelefoneValido("O234-FAIL"));
		Assert.assertFalse(Verificador.ehTelefoneValido("(())12345678"));
	}

	@Test public void testaNome(){
		Assert.assertFalse(Verificador.ehVazio("Deuzimar"));
		Assert.assertFalse(Verificador.ehVazio(" r o f l"));
		Assert.assertFalse(Verificador.ehVazio("N4OE2cr3v4m4ss1mplz"));
		Assert.assertTrue(Verificador.ehVazio(""));
		Assert.assertTrue(Verificador.ehVazio("   "));
	}

	@Test public void testaData(){
		//Data sem Ano
		Assert.assertTrue(Verificador.ehDataSemAnoValida("22/01"));
		Assert.assertTrue(Verificador.ehDataSemAnoValida("31/12"));
		Assert.assertFalse(Verificador.ehDataSemAnoValida("22/1"));
		Assert.assertFalse(Verificador.ehDataSemAnoValida("30/02"));
		Assert.assertFalse(Verificador.ehDataSemAnoValida("32/11"));
		Assert.assertFalse(Verificador.ehDataSemAnoValida("35/09"));
		Assert.assertFalse(Verificador.ehDataSemAnoValida("31/04"));
		Assert.assertFalse(Verificador.ehDataSemAnoValida("31/11"));
		Assert.assertFalse(Verificador.ehDataSemAnoValida("as/10"));
		Assert.assertFalse(Verificador.ehDataSemAnoValida("-1/10"));
		Assert.assertFalse(Verificador.ehDataSemAnoValida("22/-2"));
		Assert.assertFalse(Verificador.ehDataSemAnoValida("22\12"));
		Assert.assertFalse(Verificador.ehDataSemAnoValida("22|12"));
		Assert.assertFalse(Verificador.ehDataSemAnoValida("22X11"));

		//Data com ano
		Assert.assertTrue(Verificador.ehDataComAnoValida("22/01/0001"));
		Assert.assertTrue(Verificador.ehDataComAnoValida("22/01/2001"));
		Assert.assertTrue(Verificador.ehDataComAnoValida("29/02/2000"));
		Assert.assertFalse(Verificador.ehDataComAnoValida("29/02/2001"));
		Assert.assertFalse(Verificador.ehDataComAnoValida("29/02/2100"));
		Assert.assertFalse(Verificador.ehDataComAnoValida("31/04/2010"));
		Assert.assertFalse(Verificador.ehDataComAnoValida("29/04/-100"));
		Assert.assertFalse(Verificador.ehDataComAnoValida("39/2/00"));
		Assert.assertFalse(Verificador.ehDataComAnoValida("5/10/11"));
		Assert.assertFalse(Verificador.ehDataComAnoValida("13/07/kkkk"));
		Assert.assertFalse(Verificador.ehDataComAnoValida(""));
		Assert.assertFalse(Verificador.ehDataComAnoValida("2012/12/21"));
	}

	@Test public void testaForcaDeSenha(){
		Assert.assertEquals(0, Verificador.forcaDeSenha(""));//menos que 6 caracteres
		Assert.assertEquals(0, Verificador.forcaDeSenha("   "));//mesmo acima
		Assert.assertEquals(0, Verificador.forcaDeSenha("cinco"));//mesmo acima
		Assert.assertEquals(1, Verificador.forcaDeSenha("minusculas"));
		Assert.assertEquals(1, Verificador.forcaDeSenha("MAIUSCULAS"));
		Assert.assertEquals(1, Verificador.forcaDeSenha("%$^$$^"));//so caracteres especiais
		Assert.assertEquals(2, Verificador.forcaDeSenha("SeNhAmEdIa"));//maiusculas e minusculas
		Assert.assertEquals(2, Verificador.forcaDeSenha("s3nh4m3d14"));//minusculas e numeros
		Assert.assertEquals(3, Verificador.forcaDeSenha("S3nH4F0rT3"));//numeros, minusculas e maiusculas
		Assert.assertEquals(3, Verificador.forcaDeSenha("eh Forte"));//minusculas, maiusculas e char espacial(espaco)
		Assert.assertEquals(3, Verificador.forcaDeSenha("t@mb3m eh!"));//minusculas numeros e caracteres especiais
		Assert.assertEquals(4, Verificador.forcaDeSenha("mu1t0FOrt&"));//minusculas, maiusculas,numeros e caracteres especiais
		Assert.assertEquals(4, Verificador.forcaDeSenha("Aa4@LOL"));//mesmo Acima
		Assert.assertEquals(0, Verificador.forcaDeSenha("@aA4"));//todos os tipos de caracteres mas so tem tamanho 4
	}

	@Test public void testaEhhorarioValido(){
		Assert.assertTrue(Verificador.ehHorarioValido("20:00"));
		Assert.assertTrue(Verificador.ehHorarioValido("19:27"));
		Assert.assertTrue(Verificador.ehHorarioValido("15:00"));
		Assert.assertTrue(Verificador.ehHorarioValido("09:52"));
		Assert.assertTrue(Verificador.ehHorarioValido("23:59"));
		Assert.assertFalse(Verificador.ehHorarioValido("23:60"));
		Assert.assertFalse(Verificador.ehHorarioValido("11:99"));
		Assert.assertTrue(Verificador.ehHorarioValido("00:00"));
		Assert.assertFalse(Verificador.ehHorarioValido("-2:52"));
		Assert.assertFalse(Verificador.ehHorarioValido("99999"));
		Assert.assertFalse(Verificador.ehHorarioValido("12365"));
		Assert.assertFalse(Verificador.ehHorarioValido("21;25"));
		Assert.assertFalse(Verificador.ehHorarioValido("24:00"));
		Assert.assertFalse(Verificador.ehHorarioValido(""));
	}

	@Test public void testaLogin(){
		Usuario u1,u2;
		u1 = new Usuario("eu@bol.lol","top secret",null);
		u2 = new Usuario("voce@bol.lol","senha facil",null);
		List<Usuario> usuarios= new ArrayList<Usuario>();
		usuarios.add(u1);usuarios.add(u2);
		try {
			Verificador.autenticaLogin(usuarios, "e-mail@invalido", "naoimporta");
		} catch (Exception e) {
			Assert.assertEquals("E-mail Invalido.", e.getMessage());
		}
		try {
			Verificador.autenticaLogin(usuarios, "nem@to.cadastrado", "naoimporta");
		} catch (Exception e) {
			Assert.assertEquals("E-mail nao cadastrado.", e.getMessage());
		}
		try {
			Verificador.autenticaLogin(usuarios, "eu@bol.lol", "senhaErrada");
		} catch (Exception e) {
			Assert.assertEquals("Senha Incorreta.", e.getMessage());
		}
		try {
			Verificador.autenticaLogin(usuarios, "voce@bol.lol", "senha facil");
		} catch (Exception e) {
			Assert.fail("Nao deve ocorrer excecao aqui.");
		}
	}

	@Test public void testaEhFeriado(){
		String data= null;	
		data="20/12";
		Assert.assertFalse(Verificador.ehFeriado(data));
		data="25/12";
		Assert.assertTrue(Verificador.ehFeriado(data));
		data="01/05";
		Assert.assertTrue(Verificador.ehFeriado(data));
		data="07/09";
		Assert.assertTrue(Verificador.ehFeriado(data));
		data="21/04/2000";
		Assert.assertTrue(Verificador.ehFeriado(data));
		data="01/01/9999";
		Assert.assertTrue(Verificador.ehFeriado(data));
	}

	@Test public void testaEhFimDeSemana(){
		String data=null;
		data="20/11/2011";
		Assert.assertTrue(Verificador.ehFimDeSemana(data));
		data="19/11/2011";
		Assert.assertTrue(Verificador.ehFimDeSemana(data));
		data="23/11/2011";
		Assert.assertFalse(Verificador.ehFimDeSemana(data));
		data="01/11/2011";
		Assert.assertFalse(Verificador.ehFimDeSemana(data));
		data="31/12/2011";
		Assert.assertTrue(Verificador.ehFimDeSemana(data));
		data="01/01/2020";
		Assert.assertFalse(Verificador.ehFimDeSemana(data));
		data="12/12/2012";
		Assert.assertFalse(Verificador.ehFimDeSemana(data));
	}
}
